#pragma once
#include<string>
#include<map>
namespace  bitRPC
{
    //正文消息字段的宏
    #define KEY_METHOD      "method"
    #define KEY_PARAMATERS  "parameters"
    #define KEY_TOPIC_KEY   "topic_key"
    #define KEY_TOPIC_MSG   "topic_msg"
    #define KEY_OPTYPE      "optype"
    #define KEY_HOST        "host"
    #define KEY_HOST_PORT   "port"
    #define KEY_HOST_IP     "ip"
    #define KEY_RCODE       "rcode"
    #define KEY_RESULT      "result"
    
    enum class MType{
        REQ_RPC=0,
        RES_RPC,
        REQ_TOPIC,
        RES_TOPIC,
        REQ_SERVICE,
        RES_SERVICE
    };
    enum class Rcode{
        RCODE_OK=0,//成功
        RCODE_PARSE_FAILED,//解析失败
        RCODE_DISCONNECTED,//连接断开
        RCODE_ERRO_MSGTYPE,//消息中字段缺失或错误导致⽆效消息
        RCODE_IVALID_MSG,//无效的RPC调用
        RCODE_NOT_FOUND_SERVICE,//RPC服务不存在
        RCODE_INVALID_OPTYPE,//无效的TOPIC类型
        RCODE_NOT_FOUND_TOPIC,//TOPIC不存在
        RCODE__INTERNAL_ERROR//无效的服务操作类型

    };
    static const std::string errReason(Rcode rcode)
    {
        std::map<Rcode,std::string> reasonmap={
            {Rcode::RCODE_OK,"成功"},
            {Rcode::RCODE_PARSE_FAILED,"解析失败"},
            {Rcode::RCODE_DISCONNECTED,"连接断开"},
            {Rcode::RCODE_ERRO_MSGTYPE,"消息中字段缺失或错误导致⽆效消息"},
            {Rcode::RCODE_IVALID_MSG,"无效的RPC调用"},
            {Rcode::RCODE_NOT_FOUND_SERVICE,"RPC服务不存在"},
            {Rcode::RCODE_INVALID_OPTYPE,"无效的TOPIC类型"},
            {Rcode::RCODE_NOT_FOUND_TOPIC,"TOPIC不存在"},
            {Rcode::RCODE__INTERNAL_ERROR,"无效的服务操作类型"}
        };
        if(reasonmap.find(rcode)!=reasonmap.end())
        {
            return reasonmap[rcode];
        }
        return "未知错误";
    }
    // RPC请求类型定义
    enum class RType{
        RPC_ASYNC=0,//RPC异步调用
        RPC_SYNC,//RPC同步调用
        RPC_CALLBACK,//RPC回调
    };
    // 主题操作类型定义
    enum class TopicOptype{
        TOPIC_CREATE=0,//创建主题
        TOPIC_REMOVE,//删除主题
        TOPIC_SUBSCRIBE,//消息订阅
        TOPIC_CANCEL,//消息取消订阅
        TOPIC_PUBLISH//消息发布
    };
    // 服务操作类型定义
    enum class ServiceOptype{
        SERVICE_REGISTER=0,//服务注册
        SERVICE_DISCOVERY,//服务发现
        SERVICE_ONLINE,//服务上线
        SERVICE_OFFLINE,//服务下线
        SERVICE_UNKNOW//未知服务
    };
    
}
